package com.huike.clues.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.huike.clues.mapper.*;
import org.springframework.stereotype.Service;
import com.huike.common.core.domain.entity.SysRole;
import com.huike.common.exception.CustomException;
import com.huike.common.utils.StringUtils;
import com.huike.common.utils.spring.SpringUtils;
import com.huike.clues.domain.SysRoleDept;
import com.huike.clues.service.ISysRoleService;

import javax.annotation.Resource;

/**
 * Created with IntelliJ IDEA.
 * @Author: Copyright by jiyuzm
 * @Date: 2023/07/11/15:16
 * @Description: 角色管理类 - 业务层处理
 */

@Service
public class SysRoleServiceImpl implements ISysRoleService {
    @Resource
    private SysRoleMapper roleMapper;
    @Resource
    private SysMenuMapper sysMenuMapper;
    @Resource
    private SysRoleDeptMapper sysRoleDeptMapper;
    @Resource
    private SysRoleMenuMapper sysRoleMenuMapper;


    /**
     * 查询所有角色
     * @return 角色列表
     */
    @Override
    public List<SysRole> selectRoleAll() {
        return SpringUtils.getAopProxy(this).selectRoleList(new SysRole());
    }

    /**
     * 根据条件分页查询角色数据
     * @param role 角色信息
     * @return 角色数据集合信息
     */
    @Override
    public List<SysRole> selectRoleList(SysRole role) {
        return roleMapper.selectRoleList(role);
    }

    /**
     * 根据用户ID查询权限
     * @param userId 用户ID
     * @return 权限列表
     */
    @Override
    public Set<String> selectRolePermissionByUserId(Long userId) {
        List<SysRole> perms = roleMapper.selectRolePermissionByUserId(userId);
        Set<String> permsSet = new HashSet<>();
        for (SysRole perm : perms)
        {
            if (StringUtils.isNotNull(perm))
            {
                permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
            }
        }
        return permsSet;
    }






    /**
     * 新增角色部门信息(数据权限)
     * @param role 角色对象
     */
    public int insertRoleDept(SysRole role) {
        int rows = 1;
        // 新增角色与部门（数据权限）管理
        List<SysRoleDept> list = new ArrayList<SysRoleDept>();
        for (Long deptId : role.getDeptIds()) {
            SysRoleDept rd = new SysRoleDept();
            rd.setRoleId(role.getRoleId());
            rd.setDeptId(deptId);
            list.add(rd);
        }
        if (list.size() > 0) {
            rows = sysRoleDeptMapper.batchRoleDept(list);
        }
        return rows;
    }





    //-------------------New----------------------------
    //-------------------New----------------------------
    //-------------------New----------------------------


    /**
     * 新增角色接口
     * @param sysRole -
     */
    @Override
    public void newRole(SysRole sysRole) {
        SysRole sysRole1 = roleMapper.selectRolesByRoleName(sysRole.getRoleName());
        if (sysRole1 != null){
            throw new CustomException("角色名重复，不允许添加，请更换后重试");
        }
        //新增角色
        roleMapper.newRole(sysRole);
    }

    /**
     * 修改角色接口
     * @param sysRole -
     */
    @Override
    public void modifyRole(SysRole sysRole) {
        //修改角色信息
        roleMapper.updateRole(sysRole);
        //删除角色与菜单的关联
        sysRoleMenuMapper.deleteRoleMenuByRoleId(sysRole.getRoleId());
    }

    /**
     * 修改角色状态
     * @param sysRole -
     */
    @Override
    public void changeStatus(SysRole sysRole) {
        roleMapper.updateRole(sysRole);
    }


    /**
     * 修改角色权限
     * @param sysRole -
     */
    @Override
    public void modifyRolePermissions(SysRole sysRole) {
        //修改角色信息
        roleMapper.updateRole(sysRole);
        //删除角色与菜单的关联
        sysRoleMenuMapper.deleteRoleMenuByRoleId(sysRole.getRoleId());
        //调用方法新建部门信息
        insertRoleDept(sysRole);
    }

    /**
     * 根据用户ID获取角色选择框列表
     * @param userId-
     * @return /
     */
    @Override
    public List<Integer> selectRoleListByUserId(Long userId) {
        return roleMapper.selectRoleListByUserId(userId);
    }

    /**
     * 根据角色编号获取详细信息
     * @param roleId -
     * @return SysRole
     */
    @Override
    public SysRole selectRoleByRoleId(Long roleId) {
        SysRole sysRole = roleMapper.selectRoleByRoleId(roleId);
        return sysRole;
    }


    /**
     * 删除角色
     * @param roleIds /
     * @return /
     */
    @Override
    public int deleteRole(Long[] roleIds) {
        for (Long roleId : roleIds){
            //调用方法检测是否为管理员
            checkRoleAllowed(new SysRole(roleId));
        }

        // 批量删除角色与菜单关联
        sysRoleMenuMapper.deleteRoleMenu(roleIds);
        // 批量删除角色与部门关联
        sysRoleDeptMapper.deleteRoleDept(roleIds);
        //批量删除角色信息
        return roleMapper.deleteRoleByRoleIds(roleIds);
    }


    /**
     * 校验角色是否允许操作
     * @param role 角色信息
     */
    @Override
    public void checkRoleAllowed(SysRole role) {
        if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) {
            throw new CustomException("不允许操作超级管理员角色");
        }
    }


    /**
     * 获取角色选择框列表
     * @return 返回角色列表
     */
    @Override
    public List<SysRole> optionselect() {
        return SpringUtils.getAopProxy(this).selectRoleList(new SysRole());
    }



}
